package com.kdjack.analogInput.service;

import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;

/**
 * @author KDJack
 * @date 2020/2/18 20:14
 */
public class PressKey {

    /**
     * 键盘的码表--负数为组合键，需要按shift
     */
    private static Map<Character, Integer> keyMap = new HashMap<Character, Integer>() {
        {
            put('a', 65); put('A', -65);
            put('b', 66); put('B', -66);
            put('c', 67); put('C', -67);
            put('d', 68); put('D', -68);
            put('e', 69); put('E', -69);
            put('f', 70); put('f', -70);
            put('g', 71); put('G', -71);
            put('h', 72); put('H', -72);
            put('i', 73); put('I', -73);
            put('j', 74); put('J', -74);
            put('k', 75); put('K', -75);
            put('l', 76); put('L', -76);
            put('m', 77); put('M', -77);
            put('n', 78); put('N', -78);
            put('o', 79); put('O', -79);
            put('p', 80); put('P', -80);
            put('q', 81); put('Q', -81);
            put('r', 82); put('R', -82);
            put('s', 83); put('S', -83);
            put('t', 84); put('T', -84);
            put('u', 85); put('U', -85);
            put('v', 86); put('V', -86);
            put('w', 87); put('W', -87);
            put('x', 88); put('X', -88);
            put('y', 89); put('Y', -89);
            put('z', 90); put('Z', -90);
            put('0', 48); put(')', -48);
            put('1', 49); put('!', -49);
            put('2', 50); put('@', -50);
            put('3', 51); put('#', -51);
            put('4', 52); put('$', -52);
            put('5', 53); put('%', -53);
            put('6', 54); put('^', -54);
            put('7', 55); put('&', -55);
            put('8', 56); put('*', -56);
            put('9', 57); put('(', -57);
            put(' ', KeyEvent.VK_SPACE);
            put('`', KeyEvent.VK_BACK_QUOTE); put('~', -KeyEvent.VK_BACK_QUOTE);
            put('-', KeyEvent.VK_MINUS); put('_', -KeyEvent.VK_MINUS);
            put('=', KeyEvent.VK_EQUALS); put('+', -KeyEvent.VK_EQUALS);
            put('[', KeyEvent.VK_OPEN_BRACKET); put('{', -KeyEvent.VK_OPEN_BRACKET);
            put(']', KeyEvent.VK_CLOSE_BRACKET); put('}', -KeyEvent.VK_CLOSE_BRACKET);
            put('\\', KeyEvent.VK_BACK_SLASH); put('|', -KeyEvent.VK_BACK_SLASH);
            put(';', KeyEvent.VK_SEMICOLON); put(':', -KeyEvent.VK_SEMICOLON);
            put('\'', KeyEvent.VK_QUOTE); put('\"', -KeyEvent.VK_QUOTE);
            put(',', KeyEvent.VK_COMMA); put('<', -KeyEvent.VK_COMMA);
            put('.', KeyEvent.VK_PERIOD); put('>', -KeyEvent.VK_PERIOD);
            put('/', KeyEvent.VK_SLASH); put('?', -KeyEvent.VK_SLASH);
        }
    };

    /**
     * 按键事件
     * @param chs
     */
    public static void pressKey(Robot r, char chs) {
        pressKey(r, getKeyNumber(chs));
    }

    /**
     * 按键事件
     * @param r
     * @param key
     */
    public static void pressKey(Robot r, int key) {
        if (key == -999) {
            // 处理下中文-已经复制了，这里直接粘贴就行
            paste(r);
        } else {
            if (key < 0) {
                keyPressWithShift(r, key * -1);
            } else {
                r.keyPress(key);
            }
        }
        // 间隔10毫秒
        r.delay(10);
    }

    /**
     * 获取键盘的ASSCII码
     */
    private static int getKeyNumber(char chs) {
        // 如果是中文，那么就复制粘贴-返回-999
        if((chs >= 0x4e00)&&(chs <= 0x9fbb)) {
            if (setToClipboard(chs)) {
                return -999;
            }
        }
        return keyMap.get(chs);
    }

    /**
     * 将剪切板中的数据，模拟ctrl+v粘贴出来
     * @param r
     */
    private static void paste(Robot r) {
        //按下crtl v键 ；
        r.keyPress(KeyEvent.VK_CONTROL);
        r.keyPress(KeyEvent.VK_V);
        //释放crtl v 键
        r.keyRelease(KeyEvent.VK_V);
        r.keyRelease(KeyEvent.VK_CONTROL);
        r.delay(50);
    }

    /**
     * 增加shift按键
     * @param r
     * @param key
     */
    private static void keyPressWithShift(Robot r, int key) {
        r.keyPress(KeyEvent.VK_SHIFT);
        r.keyPress(key);
        r.keyRelease(key);
        r.keyRelease(KeyEvent.VK_SHIFT);
    }


    /**
     * 重置Shift
     * @param r
     */
    private static void resetShift(Robot r) {
        r.keyPress(KeyEvent.VK_SHIFT);
        r.keyRelease(KeyEvent.VK_SHIFT);
    }

    /**
     * 将中文复制到粘贴板中
     * @param chs
     * @return
     */
    private static Boolean setToClipboard(char chs) {
        //声明一个StingSelection 对象，并使用String的参数完成实例化；
        StringSelection stringSelection = new StringSelection(chs + "");
        //使用Toolkit对象的setContents将字符串放到粘贴板中 ；
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
        return true;
    }

}
